#include<bits/stdc++.h> 
using namespace std;
//	给定一个可以最多存储M个数的栈，按照1,2,3,..N的顺序压入N个数字，然后随机弹出。你需要判
//	断给定的序列是否有可能是弹出序列。例如如果M是5，N是7，那么1 2 3 4 5 6 7可以是我们得到
//	的结果，而3 2 1 7 5 6 4是得不到的
//1.每个输入包括一个测试用例，每个测试用例第一行包括3个都不大于1000的数字。M，N和K。其中
//	M表示栈的最大容量，N表示压入的数据长度，而K表示需要判断的弹出序列的总数。
//2.然后跟着K行数字，每行包括一个N个数字组成的序列。
//3.对于每个序列，输出YES或NO来表示是否有可能是这个栈里出来的。 
//4.栈
int main(){
	int M,N,K;
	cin>>M>>N>>K;
	for(int i = 0;i<K;i++){
		int num[N];
		for(int j = 0;j<N;j++) scanf("%d", &num[j]);
		if(N<=1){
			cout<<"YES"<<endl;
			continue;
		}
		else{
			stack<int> S;	//我们就直接按照题目说的操作做一遍就可以了，按照1~N的顺序压入栈，然后遇到跟它输出序列当前头相同的就弹出，然后序列向后一位，最后如果这个序列是成立的那么栈会空，只要栈不空，则表示不行 
			int t = 0;
			for(int k = 1;k<=N;k++){
				if(S.size()>M){
					break;
				}
				while(!S.empty()){
					if(S.top()==num[t]){
						S.pop();
						t++;
					}
					else{
						break;
					}
				}
				S.push(k);
			}
			if(S.size()<=M){
				while(!S.empty()){
					if(S.top()==num[t]){
						S.pop();
						t++;
					}
					else{
						break;
					}
				}
			}
			if(S.empty()) printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
} 